package com.wenheng.controller;

import com.alibaba.fastjson.JSONObject;
import com.google.common.util.concurrent.RateLimiter;
import com.wenheng.Produce.ProducerSeckilling;
import com.wenheng.vo.entity.Seckillproduct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Auther: 文恒
 * @Date: 2021/3/25 - 03 - 25 -11:17
 * @Description:com.wenheng.controller
 * @version:1.0
 */
@RestController
@Slf4j
public class SeckillingController {

    //判断商品 / 用户 / 活动是否存在  ？  -- 可能有多个秒杀活动 * 是=等待下面操作后 消费完消息  否=抛弃消息

    //限制流量 令牌桶  保证接口能正常工作  安全工作

    //RMQ 通知开始业务 同一个系统内的实例 保证进入到的每一个业务在未完成相关操作时 不能进行下一个消息消费

    //判断库存  是=等待下面操作后 消费完消息  否=抛弃消息

    //执行乐观锁执行业务

    //通知订单系统 生成订单

    /**
     * 接收秒杀业务接口
     */
    //private RateLimiter rateLimiter = RateLimiter.create(40);
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private ProducerSeckilling producerSeckilling;

    //参数依次为 商品id 活动id 购买数量--判断限制

    @GetMapping("/seckilling/kill/{id}/{activityId}/{NumSeckill}")
    public String kill(@PathVariable("id")Integer id
            ,@PathVariable("activityId")Integer activityId
            ,@PathVariable("NumSeckill")Integer NumSeckill,
                       HttpServletRequest request
    ){
        //判断商品 / 用户 / 活动是否存在
        String tongzhi = ActivitExists(id,0,NumSeckill);
        if(!tongzhi.equals("200")){
            return tongzhi;
        }
//        if(rateLimiter.tryAcquire(1, TimeUnit.SECONDS)){
//            System.out.println("抢购失败！！！");
//            return "抢购失败";
//        }
        //执行业务  通知RMQ进行业务
        String ids = id+","+activityId+","+NumSeckill+","+request.getHeader("token");
        producerSeckilling.sendMail("myqueue",ids);
        return "nihao";
    }

    //判断商品/活动是否存在 id 商品id activityId 活动id 这个activityId 是拼接在kill的后面的 判断活动时候存在
    public String ActivitExists(Integer id,Integer activityId,Integer NumSeckill){
        if(redisTemplate.hasKey("kill")) {
            List<Seckillproduct> list = JSONObject.parseArray(redisTemplate.opsForValue().get("kill")).toJavaList(Seckillproduct.class);
            for (Seckillproduct seckillproduct : list) {
                if(seckillproduct.getProdectid().equals(id)){
                    if(seckillproduct.getNumseckill()<NumSeckill){
                        return "购买数量超出限额";
                    }else{
                        return "200";
                    }
                }
            }
            return "商品不存在！";
        }else{
            return "活动结束！！";
        }
    }
}
